iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
Software Development

[Python QT] 玩玩 Pyside 的各種功能系列 第 6

【Day06】QTableWidget 表格 with Images 圖片

  • 分享至 

  • xImage
  •  

一樣補上前幾天沒有提到的 layout, layout 就是版面設計, 想要讓元件以怎樣的方式排可以以 QHBoxLayout 和 QVBoxLayout 實現, H 代表 Horizontal 水平, 而 V 代表 Vertical 垂直, 拿 Day04 的結果來看

https://ithelp.ithome.com.tw/upload/images/20220908/20151144E71RCZOdXD.png

紅色部份是 QVBoxLayout, 由上到下是 10 個 QLabel 加 1 個 QHBoxLayout, 而藍色部分左邊為 QLineEdit 右邊為 QPushButton, 好好使用 QVBoxLayout 跟 QHBoxLayout 就可以輕鬆建成想要的版面


回到今天的主題, 官方文件上 QLineEdit 後是 QTable, 這個是我碰最最最最多的部分, 從昨天的主題就可以知道, 元件裡還可以塞其他小元件, 一個 QLineEdit 文字輸入框裡可以塞 QLineEdit 文字輸入框, 一個 QPushButton 按鈕裡可以還以塞 QLabel, 那 QTable 裡每一格不就可以把前幾天的主題進去?!

對!

QTable 可以玩的超級多, 隨著後面會使用的元件越多, QTable 可以玩的花樣也更多, 今天我們先看最簡單的 QTable, 單純秀文字

import sys
from PySide6.QtGui import QColor, QIcon
from PySide6.QtWidgets import (QApplication, QTableWidget,
                            QTableWidgetItem)

servants = [("EMIYA", "Archer"),
        ("Gilgamesh", "Archer"),
        ("Cu Chulainn", "Lancer"),
        ("Alexander", "Rider"),
        ("Zhuge Liang (El-Melloi II)", "Caster"),
        ("Cu Chulainn (Caster)", "Caster"),
        ("Solomon (Grand Caster)", "Caster (Grand)"),
        ("Arjuna", "Archer"),
        ("Karna", "Lancer"),
        ("Kid Gilgamesh", "Archer"),
        ("Edmond Dantes", "Avenger"),
        ("Cu Chulainn (Alter)", "Berserker")]

if __name__ == "__main__":
    app = QApplication([])
    QApplication.setApplicationName("Hello")
    QApplication.setWindowIcon(QIcon("214.png"))
    table = QTableWidget()
    table.setRowCount(len(servants))
    table.setColumnCount(len(servants[0]))
    table.setHorizontalHeaderLabels(["Name", "Class"])
    for i, (name, _class) in enumerate(servants):
        servant_name = QTableWidgetItem(name)
        servant_class = QTableWidgetItem(_class)
        table.setItem(i, 0, servant_name)
        table.setItem(i, 1, servant_class)

    table.show()
    sys.exit(app.exec())

展示如下
https://ithelp.ithome.com.tw/upload/images/20220908/20151144W3iDH050iT.png
是的, 我私心想秀我喜歡的遊戲內的喜歡的角色

這次我們把圖片利用 QIcon 塞到 QTableWidget裡
把人物的大頭放進去嘿嘿嘿

import sys
from PySide6.QtCore import Qt
from PySide6.QtGui import QIcon, QPixmap
from PySide6.QtWidgets import (QApplication, QTableWidget,
                            QTableWidgetItem, QLabel)

servants = [("EMIYA", "Archer"),
        ("Gilgamesh", "Archer"),
        ("Cu Chulainn", "Lancer"),
        ("Alexander", "Rider"),
        ("Zhuge Liang (El-Melloi II)", "Caster"),
        ("Cu Chulainn (Caster)", "Caster"),
        ("Solomon (Grand Caster)", "Caster (Grand)"),
        ("Arjuna", "Archer"),
        ("Karna", "Lancer"),
        ("Kid Gilgamesh", "Archer"),
        ("Edmond Dantes", "Avenger"),
        ("Cu Chulainn (Alter)", "Berserker")]

if __name__ == "__main__":
    app = QApplication([])
    QApplication.setApplicationName("Hello")
    QApplication.setWindowIcon(QIcon("214.png"))
    table = QTableWidget()
    table.setRowCount(len(servants))
    table.setColumnCount(len(servants[0])+1)
    table.setHorizontalHeaderLabels(["Icon", "Name", "Class"])
    for i, (name, _class) in enumerate(servants):
        servantIcon = QLabel("")
        servantIcon.setPixmap(QPixmap("%s.png" % name))
        servantName = QTableWidgetItem(name)
        servantClass = QTableWidgetItem(_class)
        table.setCellWidget(i, 0, servantIcon)
        table.setItem(i, 1, servantName)
        table.setItem(i, 2, servantClass)

    table.resizeRowsToContents()
    table.resizeColumnsToContents()

    table.show()
    sys.exit(app.exec())

展示如下
https://ithelp.ithome.com.tw/upload/images/20220908/20151144GzrF43CPop.png

在這裡為了程式簡潔, 我特地把圖案的名稱改得跟程式裡的 name 變數一樣, 這樣我只要使用 name 來取得圖片位置即可


上一篇
【Day05】QLabel in QPushButton
下一篇
【Day07】試著把 QPushButton 按鈕放進 QTableWidget 表格
系列文
[Python QT] 玩玩 Pyside 的各種功能31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言